package cn.com.greatwall.flowable.service;

import java.util.List;
import java.util.Map;

import org.flowable.task.api.Task;
import org.springframework.data.domain.Pageable;

import cn.com.greatwall.flowable.common.CommentTypeEnum;
import cn.com.greatwall.flowable.service.dto.FlowNodeDto;
import cn.com.greatwall.flowable.service.dto.TaskDto;
import cn.com.greatwall.flowable.service.dto.TaskInfoDto;
import cn.com.greatwall.flowable.service.dto.criteria.TaskQueryCriteria;

/**
 * @Author herw
 * @Time 2020-11-24 15:27:58
 * @Version 1.0
 * @Description: TODO(用一句话描述该文件做什么)
 */

public interface TaskService {
    /**
     * 分页查询
     * 
     * @param criteria 条件
     * @param pageable 分页参数
     * @return /
     */
    Map<String, Object> queryAll(TaskQueryCriteria criteria, Pageable pageable);

    /**
     * 根据ID查询任务
     * 
     * @param taskId
     * @return
     */
    TaskInfoDto findTaskInfoById(String taskId);
    
    /**
     * 查询单一任务详情
     *
     * @param taskId
     * @return
     */
    Task findTaskById(String taskId);

    /**
     * 分页查询
     * 
     * @param criteria 条件
     * @param pageable 分页参数
     * @return /
     */
    Map<String, Object> queryTodo(TaskQueryCriteria criteria, Pageable pageable);

    /**
     * 分页查询
     * 
     * @param criteria 条件
     * @param pageable 分页参数
     * @return /
     */
    Map<String, Object> queryDone(TaskQueryCriteria criteria, Pageable pageable);

    /**
     * 认领任务
     * 
     * @param dto
     */
    void claimTask(TaskDto dto);

    /**
     * 取消认领
     *
     * @param dto
     */
    void unclaimTask(TaskDto dto);
    
    /**
     * 完成任务
     *
     * @param dto
     */
    void completeTask(TaskDto dto);
    
    /**
     * 转办任务
     *
     * @param dto
     */
    void assignTask(TaskDto dto);
    
    /**
     * 委派任务
     *
     * @param dto
     */
    void delegateTask(TaskDto dto);
    
    /**
     * 执行任务
     *
     * @param taskId
     */
    Map<String, Object> executeTask(String taskId);
    
    /**
     * 查询可退回节点
     *
     * @param taskId
     * @return
     */
    List<FlowNodeDto> getBackNodes(String taskId);
    
    /**
     * 退回任务
     *
     * @param dto
     */
    void backTask(TaskDto dto);
    
    /**
     * 终止任务
     *
     * @param dto
     */
    void stopTask(TaskDto dto);
    
    /**
     * 新增过程意见
     *
     * @param taskId
     * @param processInstanceId
     * @param userId
     * @param type
     * @param message
     */
    void addComment(String taskId, String processInstanceId, String userId, CommentTypeEnum type, String message);
}
